function deepClone(obj, wm = new WeakMap()) {
	// 如果是基本数据类型，直接返回
	if (obj !== null && typeof obj !== "object") {
		return obj;
	}

	// 避免循环引用
	if (wm.get(obj)) {
		return wm.get(obj);
	}

	// 如果是函数，重新返回函数
	if (obj instanceof Function) {
		return function () {
			obj.call(this, ...arguments);
		};
	}
	// 如果是日期类型，直接返回日期实例
	if (obj instanceof Date) {
		return new Date(obj);
	}

	// 如果是正则对象
	if (obj instanceof RegExp) {
		return new RegExp(obj.source, obj.flags);
	}

	// 如果是错误类型
	if (obj instanceof Error) {
		return new Error(obj.message);
	}
	// 数组或者对象
	let res = Array.isArray(obj) ? [] : {};

	// 使用WeakMap进行记录
	wm.set(obj, res);

	for (let k in obj) {
		if (obj[k] instanceof Object) {
			// 如果是对象，进行递归调用
			res[k] = deepClone(obj[k], wm);
		} else {
			// 否则加入到res中
			res[k] = obj[k];
		}
	}
	return res;
}

let obj = {
	name: "张三",
	age: 18,
	obj1: {
		name: "李四",
		age: 20,
	},
};
obj.obj1 = obj; // 循环引用

let newObj = deepClone(obj);
// newObj.age = 20
console.log(obj);
console.log(newObj);
